home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / programming / other / mesa / mesa-tk / samples.tk / eval.c < prev    next >
C/C++ Source or Header  |  2000-02-23  |  10KB  |  491 lines

  1. /*
  2.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or
  9.  * publicity relating to the software without the specific, prior written
  10.  * permission of Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND,
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include <math.h>
  29. #include "gltk.h"
  30.  
  31. #define VORDER 10
  32. #define CORDER 10
  33. #define TORDER 3
  34.  
  35. #define VMAJOR_ORDER 2
  36. #define VMINOR_ORDER 3
  37.  
  38. #define CMAJOR_ORDER 2
  39. #define CMINOR_ORDER 2
  40.  
  41. #define TMAJOR_ORDER 2
  42. #define TMINOR_ORDER 2
  43.  
  44. #define VDIM 4
  45. #define CDIM 4
  46. #define TDIM 2
  47.  
  48. #define ONE_D 1
  49. #define TWO_D 2
  50.  
  51. #define EVAL 3
  52. #define MESH 4
  53.  
  54. GLenum doubleBuffer, directRender;
  55.  
  56. float rotX = 0.0, rotY = 0.0, translateZ = -1.0;
  57.  
  58. GLenum arrayType = ONE_D;
  59. GLenum colorType = GL_FALSE;
  60. GLenum textureType = GL_FALSE;
  61. GLenum polygonFilled = GL_FALSE;
  62. GLenum lighting = GL_FALSE;
  63. GLenum mapPoint = GL_FALSE;
  64. GLenum mapType = EVAL;
  65.  
  66. double point1[10 * 4] =
  67. {
  68.   -0.5, 0.0, 0.0, 1.0,
  69.   -0.4, 0.5, 0.0, 1.0,
  70.   -0.3, -0.5, 0.0, 1.0,
  71.   -0.2, 0.5, 0.0, 1.0,
  72.   -0.1, -0.5, 0.0, 1.0,
  73.   0.0, 0.5, 0.0, 1.0,
  74.   0.1, -0.5, 0.0, 1.0,
  75.   0.2, 0.5, 0.0, 1.0,
  76.   0.3, -0.5, 0.0, 1.0,
  77.   0.4, 0.0, 0.0, 1.0,
  78. };
  79. double cpoint1[10 * 4] =
  80. {
  81.   0.0, 0.0, 1.0, 1.0,
  82.   0.3, 0.0, 0.7, 1.0,
  83.   0.6, 0.0, 0.3, 1.0,
  84.   1.0, 0.0, 0.0, 1.0,
  85.   1.0, 0.3, 0.0, 1.0,
  86.   1.0, 0.6, 0.0, 1.0,
  87.   1.0, 1.0, 0.0, 1.0,
  88.   1.0, 1.0, 0.5, 1.0,
  89.   1.0, 1.0, 1.0, 1.0,
  90. };
  91. double tpoint1[11 * 4] =
  92. {
  93.   0.0, 0.0, 0.0, 1.0,
  94.   0.0, 0.1, 0.0, 1.0,
  95.   0.0, 0.2, 0.0, 1.0,
  96.   0.0, 0.3, 0.0, 1.0,
  97.   0.0, 0.4, 0.0, 1.0,
  98.   0.0, 0.5, 0.0, 1.0,
  99.   0.0, 0.6, 0.0, 1.0,
  100.   0.0, 0.7, 0.0, 1.0,
  101.   0.0, 0.8, 0.0, 1.0,
  102.   0.0, 0.9, 0.0, 1.0,
  103. };
  104. double point2[2 * 3 * 4] =
  105. {
  106.   -0.5, -0.5, 0.5, 1.0,
  107.   0.0, 1.0, 0.5, 1.0,
  108.   0.5, -0.5, 0.5, 1.0,
  109.   -0.5, 0.5, -0.5, 1.0,
  110.   0.0, -1.0, -0.5, 1.0,
  111.   0.5, 0.5, -0.5, 1.0,
  112. };
  113. double cpoint2[2 * 2 * 4] =
  114. {
  115.   0.0, 0.0, 0.0, 1.0,
  116.   0.0, 0.0, 1.0, 1.0,
  117.   0.0, 1.0, 0.0, 1.0,
  118.   1.0, 1.0, 1.0, 1.0,
  119. };
  120. double tpoint2[2 * 2 * 2] =
  121. {
  122.   0.0, 0.0, 0.0, 1.0,
  123.   1.0, 0.0, 1.0, 1.0,
  124. };
  125. float textureImage[4 * 2 * 4] =
  126. {
  127.   1.0, 1.0, 1.0, 1.0,
  128.   1.0, 0.0, 0.0, 1.0,
  129.   1.0, 0.0, 0.0, 1.0,
  130.   1.0, 1.0, 1.0, 1.0,
  131.   1.0, 1.0, 1.0, 1.0,
  132.   1.0, 0.0, 0.0, 1.0,
  133.   1.0, 0.0, 0.0, 1.0,
  134.   1.0, 1.0, 1.0, 1.0,
  135. };
  136.  
  137. static void Init(void)
  138. {
  139.   static float ambient[] =
  140.   {0.1, 0.1, 0.1, 1.0};
  141.   static float diffuse[] =
  142.   {1.0, 1.0, 1.0, 1.0};
  143.   static float position[] =
  144.   {0.0, 0.0, -150.0, 0.0};
  145.   static float front_mat_diffuse[] =
  146.   {1.0, 0.2, 1.0, 1.0};
  147.   static float back_mat_diffuse[] =
  148.   {1.0, 1.0, 0.2, 1.0};
  149.   static float lmodel_ambient[] =
  150.   {1.0, 1.0, 1.0, 1.0};
  151.   static float lmodel_twoside[] =
  152.   {GL_TRUE};
  153.   static float decal[] =
  154.   {GL_DECAL};
  155.   static float repeat[] =
  156.   {GL_REPEAT};
  157.   static float nr[] =
  158.   {GL_NEAREST};
  159.  
  160.   glFrontFace(GL_CCW);
  161.  
  162.   glEnable(GL_DEPTH_TEST);
  163.  
  164.   glMap1d(GL_MAP1_VERTEX_4, 0.0, 1.0, VDIM, VORDER, point1);
  165.   glMap1d(GL_MAP1_COLOR_4, 0.0, 1.0, CDIM, CORDER, cpoint1);
  166.  
  167.   glMap2d(GL_MAP2_VERTEX_4, 0.0, 1.0, VMINOR_ORDER * VDIM, VMAJOR_ORDER, 0.0,
  168.       1.0, VDIM, VMINOR_ORDER, point2);
  169.   glMap2d(GL_MAP2_COLOR_4, 0.0, 1.0, CMINOR_ORDER * CDIM, CMAJOR_ORDER, 0.0,
  170.       1.0, CDIM, CMINOR_ORDER, cpoint2);
  171.   glMap2d(GL_MAP2_TEXTURE_COORD_2, 0.0, 1.0, TMINOR_ORDER * TDIM,
  172.       TMAJOR_ORDER, 0.0, 1.0, TDIM, TMINOR_ORDER, tpoint2);
  173.  
  174.   glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  175.   glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  176.   glLightfv(GL_LIGHT0, GL_POSITION, position);
  177.  
  178.   glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  179.   glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  180.  
  181.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  182.   glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  183.  
  184.   glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  185.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  186.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  187.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nr);
  188.   glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nr);
  189.   glTexImage2D(GL_TEXTURE_2D, 0, 4, 2, 4, 0, GL_RGBA, GL_FLOAT,
  190.            (GLvoid *) textureImage);
  191. }
  192.  
  193. static void DrawPoints1(void)
  194. {
  195.   GLint i;
  196.  
  197.   glColor3f(0.0, 1.0, 0.0);
  198.   glPointSize(2);
  199.   glBegin(GL_POINTS);
  200.   for (i = 0; i < VORDER; i++) {
  201.     glVertex4dv(&point1[i * 4]);
  202.   }
  203.   glEnd();
  204. }
  205.  
  206. static void DrawPoints2(void)
  207. {
  208.   GLint i, j;
  209.  
  210.   glColor3f(1.0, 0.0, 1.0);
  211.   glPointSize(2);
  212.   glBegin(GL_POINTS);
  213.   for (i = 0; i < VMAJOR_ORDER; i++) {
  214.     for (j = 0; j < VMINOR_ORDER; j++) {
  215.       glVertex4dv(&point2[i * 4 * VMINOR_ORDER + j * 4]);
  216.     }
  217.   }
  218.   glEnd();
  219. }
  220.  
  221. static void DrawMapEval1(float du)
  222. {
  223.   float u;
  224.  
  225.   glColor3f(1.0, 0.0, 0.0);
  226.   glBegin(GL_LINE_STRIP);
  227.   for (u = 0.0; u < 1.0; u += du) {
  228.     glEvalCoord1d(u);
  229.   }
  230.   glEvalCoord1d(1.0);
  231.   glEnd();
  232. }
  233.  
  234. static void DrawMapEval2(float du, float dv)
  235. {
  236.   float u, v, tmp;
  237.  
  238.   glColor3f(1.0, 0.0, 0.0);
  239.   for (v = 0.0; v < 1.0; v += dv) {
  240.     glBegin(GL_QUAD_STRIP);
  241.     for (u = 0.0; u <= 1.0; u += du) {
  242.       glEvalCoord2d(u, v);
  243.       tmp = (v + dv < 1.0) ? (v + dv) : 1.0;
  244.       glEvalCoord2d(u, tmp);
  245.     }
  246.     glEvalCoord2d(1.0, v);
  247.     glEvalCoord2d(1.0, v + dv);
  248.     glEnd();
  249.   }
  250. }
  251.  
  252. static void RenderEval(void)
  253. {
  254.  
  255.   if (colorType) {
  256.     glEnable(GL_MAP1_COLOR_4);
  257.     glEnable(GL_MAP2_COLOR_4);
  258.   }
  259.   else {
  260.     glDisable(GL_MAP1_COLOR_4);
  261.     glDisable(GL_MAP2_COLOR_4);
  262.   }
  263.  
  264.   if (textureType) {
  265.     glEnable(GL_TEXTURE_2D);
  266.     glEnable(GL_MAP2_TEXTURE_COORD_2);
  267.   }
  268.   else {
  269.     glDisable(GL_TEXTURE_2D);
  270.     glDisable(GL_MAP2_TEXTURE_COORD_2);
  271.   }
  272.  
  273.   if (polygonFilled) {
  274.     glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
  275.   }
  276.   else {
  277.     glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
  278.   }
  279.  
  280.   glShadeModel(GL_SMOOTH);
  281.  
  282.   switch (mapType) {
  283.     case EVAL:
  284.       switch (arrayType) {
  285.     case ONE_D:
  286.       glDisable(GL_MAP2_VERTEX_4);
  287.       glEnable(GL_MAP1_VERTEX_4);
  288.       DrawPoints1();
  289.       DrawMapEval1(0.1 / VORDER);
  290.       break;
  291.     case TWO_D:
  292.       glDisable(GL_MAP1_VERTEX_4);
  293.       glEnable(GL_MAP2_VERTEX_4);
  294.       DrawPoints2();
  295.       DrawMapEval2(0.1 / VMAJOR_ORDER, 0.1 / VMINOR_ORDER);
  296.       break;
  297.     default:
  298.       break;
  299.       }
  300.       break;
  301.     case MESH:
  302.       switch (arrayType) {
  303.     case ONE_D:
  304.       DrawPoints1();
  305.       glDisable(GL_MAP2_VERTEX_4);
  306.       glEnable(GL_MAP1_VERTEX_4);
  307.       glColor3f(0.0, 0.0, 1.0);
  308.       glMapGrid1d(40, 0.0, 1.0);
  309.       if (mapPoint) {
  310.         glPointSize(2);
  311.         glEvalMesh1(GL_POINT, 0, 40);
  312.       }
  313.       else {
  314.         glEvalMesh1(GL_LINE, 0, 40);
  315.       }
  316.       break;
  317.     case TWO_D:
  318.       DrawPoints2();
  319.       glDisable(GL_MAP1_VERTEX_4);
  320.       glEnable(GL_MAP2_VERTEX_4);
  321.       glColor3f(0.0, 0.0, 1.0);
  322.       glMapGrid2d(20, 0.0, 1.0, 20, 0.0, 1.0);
  323.       if (mapPoint) {
  324.         glPointSize(2);
  325.         glEvalMesh2(GL_POINT, 0, 20, 0, 20);
  326.       }
  327.       else if (polygonFilled) {
  328.         glEvalMesh2(GL_FILL, 0, 20, 0, 20);
  329.       }
  330.       else {
  331.         glEvalMesh2(GL_LINE, 0, 20, 0, 20);
  332.       }
  333.       break;
  334.     default:
  335.       break;
  336.       }
  337.       break;
  338.     default:
  339.       break;
  340.   }
  341. }
  342.  
  343. static void Reshape(int width, int height)
  344. {
  345.  
  346.   glViewport(0, 0, (GLint) width, (GLint) height);
  347.  
  348.   glMatrixMode(GL_PROJECTION);
  349.   glLoadIdentity();
  350.   glOrtho(-1.0, 1.0, -1.0, 1.0, -0.5, 10.0);
  351.   glMatrixMode(GL_MODELVIEW);
  352. }
  353.  
  354. static GLenum Key(int key, GLenum mask)
  355. {
  356.  
  357.   switch (key) {
  358.     case TK_ESCAPE:
  359.       tkQuit();
  360.     case TK_LEFT:
  361.       rotY -= 30;
  362.       break;
  363.     case TK_RIGHT:
  364.       rotY += 30;
  365.       break;
  366.     case TK_UP:
  367.       rotX -= 30;
  368.       break;
  369.     case TK_DOWN:
  370.       rotX += 30;
  371.       break;
  372.     case TK_1:
  373.       arrayType = ONE_D;
  374.       break;
  375.     case TK_2:
  376.       arrayType = TWO_D;
  377.       break;
  378.     case TK_e:
  379.       mapType = EVAL;
  380.       break;
  381.     case TK_m:
  382.       mapType = MESH;
  383.       break;
  384.     case TK_f:
  385.       polygonFilled = !polygonFilled;
  386.       break;
  387.     case TK_p:
  388.       mapPoint = !mapPoint;
  389.       break;
  390.     case TK_c:
  391.       colorType = !colorType;
  392.       break;
  393.     case TK_t:
  394.       textureType = !textureType;
  395.       break;
  396.     case TK_l:
  397.       lighting = !lighting;
  398.       if (lighting) {
  399.     glEnable(GL_LIGHTING);
  400.     glEnable(GL_LIGHT0);
  401.     glEnable(GL_AUTO_NORMAL);
  402.       }
  403.       else {
  404.     glDisable(GL_LIGHTING);
  405.     glDisable(GL_LIGHT0);
  406.     glDisable(GL_AUTO_NORMAL);
  407.       }
  408.       break;
  409.     default:
  410.       return GL_FALSE;
  411.   }
  412.   return GL_TRUE;
  413. }
  414.  
  415. static void Draw(void)
  416. {
  417.  
  418.   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  419.  
  420.   glPushMatrix();
  421.  
  422.   glTranslatef(0.0, 0.0, translateZ);
  423.   glRotatef(rotX, 1, 0, 0);
  424.   glRotatef(rotY, 0, 1, 0);
  425.   RenderEval();
  426.  
  427.   glPopMatrix();
  428.  
  429.   glFlush();
  430.  
  431.   if (doubleBuffer) {
  432.     tkSwapBuffers();
  433.   }
  434. }
  435.  
  436. static GLenum Args(int argc, char **argv)
  437. {
  438.   GLint i;
  439.  
  440.   doubleBuffer = GL_FALSE;
  441.   directRender = GL_TRUE;
  442.  
  443.   for (i = 1; i < argc; i++) {
  444.     if (strcmp(argv[i], "-sb") == 0) {
  445.       doubleBuffer = GL_FALSE;
  446.     }
  447.     else if (strcmp(argv[i], "-db") == 0) {
  448.       doubleBuffer = GL_TRUE;
  449.     }
  450.     else if (strcmp(argv[i], "-dr") == 0) {
  451.       directRender = GL_TRUE;
  452.     }
  453.     else if (strcmp(argv[i], "-ir") == 0) {
  454.       directRender = GL_FALSE;
  455.     }
  456.     else {
  457.       printf("%s (Bad option).\n", argv[i]);
  458.       return GL_FALSE;
  459.     }
  460.   }
  461.   return GL_TRUE;
  462. }
  463.  
  464. void main(int argc, char **argv)
  465. {
  466.   GLenum type;
  467.  
  468.   if (Args(argc, argv) == GL_FALSE) {
  469.     tkQuit();
  470.   }
  471.  
  472.   tkInitPosition(0, 0, 300, 300);
  473.  
  474.   type = TK_RGB | TK_DEPTH;
  475.   type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  476.   type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  477.   tkInitDisplayMode(type);
  478.  
  479.   if (tkInitWindow("Evaluator Test") == GL_FALSE) {
  480.     tkQuit();
  481.   }
  482.  
  483.   Init();
  484.  
  485.   tkExposeFunc(Reshape);
  486.   tkReshapeFunc(Reshape);
  487.   tkKeyDownFunc(Key);
  488.   tkDisplayFunc(Draw);
  489.   tkExec();
  490. }
  491.